package com.wangzy.myairobot;

import android.content.Context;
import android.util.Log;

import com.alibaba.fastjson.JSONException;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.idst.nui.AsrResult;
import com.alibaba.idst.nui.CommonUtils;
import com.alibaba.idst.nui.Constants;
import com.alibaba.idst.nui.INativeFileTransCallback;
import com.alibaba.idst.nui.NativeNui;


public class AIVoiceSDK {

    public static String TAG = "aisdk";

    static NativeNui nui_instance;

    public static void init(Context context) {

        //这里获得资源路径, 即工作路径
//  内部通过context.getApplicationContext().getFilesDir().toString() + "/asr_my" 创建工作路径，
//  例如 /data/user/0/mit.alibaba.nuidemo/files/asr_my
        String workspace = CommonUtils.getModelPath(context);

        String asset_path = "";
//创建debug路径
        String debug_path = context.getExternalCacheDir().getAbsolutePath() + "/debug_" + System.currentTimeMillis();
        Utils.createDir(debug_path);

//从nuisdk.aar中assets资源拷贝到workspace中
        CommonUtils.copyAssetsData(context);

//初始化SDK，注意用户需要在genInitParams中填入相关ID信息才可以使用。
        nui_instance = new NativeNui();
        int ret = nui_instance.initialize(new INativeFileTransCallback() {

            @Override
            public void onFileTransEventCallback(Constants.NuiEvent event, int i, int i1, AsrResult asrResult, String taskId) {

                Log.i(TAG, "event=" + event + " task_id " + taskId);

              /*  if (event == Constants.NuiEvent.EVENT_FILE_TRANS_UPLOADED) {
                    showText(asrView, "完成上传，正在转写...");
                } else if (event == Constants.NuiEvent.EVENT_FILE_TRANS_RESULT) {
                    showText(asrView, asrResult.asrResult);
                    setButtonState(startButton, true);
                    setButtonState(cancelButton, false);
                } else if (event == Constants.NuiEvent.EVENT_ASR_ERROR) {
                    Log.i(TAG, "error happened: " + resultCode);
                    showText(asrView, asrResult.asrResult);
                    setButtonState(startButton, true);
                    setButtonState(cancelButton, false);
                }*/

            }
        }, genInitParams(asset_path, debug_path), Constants.LogLevel.LOG_LEVEL_VERBOSE, true);

        Log.d(TAG, "result-----> " + ret);
    }

    private static String genInitParams(String workpath, String debugpath) {
        String str = "";
        try {
            //获取账号访问凭证：
            //  getTicket为示例工程中提供了多种可能的方式，请选择适合自身业务的安全方式
            //
            //注意:
            //  语音交互服务需要先准备好账号，并开通相关服务。具体步骤请查看：
            //    https://help.aliyun.com/zh/isi/getting-started/start-here
            //
            //原始账号:
            //  账号(子账号)信息主要包括AccessKey ID(后续简称为ak_id)和AccessKey Secret(后续简称为ak_secret)。
            //  此账号信息一定不可存储在app代码中或移动端侧，以防账号信息泄露造成资费损失。
            //
            //STS临时凭证:
            //  由于账号信息下发给客户端存在泄露的可能，阿里云提供的一种临时访问权限管理服务STS(Security Token Service)。
            //  STS是由账号信息ak_id和ak_secret，通过请求生成临时的sts_ak_id/sts_ak_secret/sts_token
            //  (为了区别原始账号信息和STS临时凭证, 命名前缀sts_表示STS生成的临时凭证信息)
            //什么是STS：https://help.aliyun.com/zh/ram/product-overview/what-is-sts
            //STS SDK概览：https://help.aliyun.com/zh/ram/developer-reference/sts-sdk-overview
            //STS Python SDK调用示例：https://help.aliyun.com/zh/ram/developer-reference/use-the-sts-openapi-example
            //
            //账号需求说明:
            //  若使用离线功能(离线语音合成、唤醒), 则必须app_key、ak_id和ak_secret，或app_key、sts_ak_id、sts_ak_secret和sts_token
            //  若使用在线功能(语音合成、实时转写、一句话识别、录音文件转写等), 则只需app_key和token
            JSONObject object = Auth.getTicket(Auth.GetTicketMethod.GET_TOKEN_FROM_SERVER_FOR_ONLINE_FEATURES);
            if (!object.containsKey("token")) {
                Log.e(TAG, "Cannot get token!!!");
            }

            object.put("device_id", Utils.getDeviceId()); // 必填, 推荐填入具有唯一性的id, 方便定位问题
            object.put("url", "wss://nls-gateway.cn-shanghai.aliyuncs.com:443/ws/v1"); // 默认
            object.put("workspace", workpath); // 必填, 且需要有读写权限

            //当初始化SDK时的save_log参数取值为true时，该参数生效。表示是否保存音频debug，该数据保存在debug目录中，需要确保debug_path有效可写。
            //object.put("save_wav", "true");
            //debug目录，当初始化SDK时的save_log参数取值为true时，该目录用于保存中间音频文件。
            object.put("debug_path", debugpath);

            object.put("service_mode", Constants.ModeFullCloud); // 必填
            str = object.toString();
        } catch (JSONException e) {
            e.printStackTrace();
        }

        Log.i(TAG, "InsideUserContext:" + str);
        return str;
    }

    public static void startDialog() {
        nui_instance.startDialog(Constants.VadMode.TYPE_P2T, genDialogParams());
    }


    private static String genDialogParams() {
        String params = "";
        try {
            JSONObject dialog_param = new JSONObject();
            //运行过程中可以在startDialog时更新参数，尤其是更新过期token
            //dialog_param.put("token", "");
            params = dialog_param.toString();
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return params;
    }


}
